#include <iostream>
#include <fcntl.h>
#include<string.h>
#include <sys/mman.h>
#include <sys/stat.h>
#include <unistd.h>

//内存映射文件避免了传统 I/O 的用户空间和内核空间的数据拷贝，提高了大文件操作效率，特别适合随机访问场景。

int main() 
{
    const char* filename = "test.txt";
    const char* message = "Hello, mmap!";
    const size_t size = 13;

    // 创建并写入测试文件
    int fd = open(filename, O_RDWR | O_CREAT | O_TRUNC, 0644);
    if (fd == -1) {
        perror("open");
        return 1;
    }

    //通过lseek和write扩展文件大小到所需长度
    lseek(fd, size - 1, SEEK_SET);
    write(fd, "", 1);

    // 内存映射文件
    char* map = static_cast<char*>(mmap(
        nullptr,        // 让系统选择映射地址
        size,           // 映射大小
        PROT_READ | PROT_WRITE,  // 可读可写
        MAP_SHARED,     // 更改会写回文件
        fd,             // 文件描述符
        0               // 从文件起始位置开始映射
    ));

    //成功时
    //返回类型：void*
    //返回值：指向映射区域起始地址的指针
    //失败时
    //返回值：宏MAP_FAILED（通常被定义为(void*)-1）
    //错误处理：需通过errno获取具体错误码
    //常见错误码：
    //EACCES：文件权限不足或标志不匹配
    //EAGAIN：文件被锁定或已达到系统内存限制
    //EBADF：文件描述符无效
    //EINVAL：参数无效（如大小为 0 或偏移量未对齐）
    //ENOMEM：内存不足或地址空间不足
    
    if (map == MAP_FAILED) 
    {
         perror("mmap");
        close(fd);
        return 1;
    }

    // 写入数据到映射区域
    memcpy(map, message, size);

    // 同步到磁盘
    if (msync(map, size, MS_SYNC) == -1) {
        perror("msync");
    }

    // 解除映射
    if (munmap(map, size) == -1) {
        perror("munmap");
    }

    close(fd);
    std::cout << "文件映射完成，内容已写入 " << filename << std::endl;
    return 0;
}    
